[Imprint][Data Privacy Statement][E-Mail]

Back to main index. View the specification. View theorem base summary, View theorem base listing, the used properties by spec, the dependency list, the symbol table,

Specification AccessControl4Vars
enrich gen-secdomain
 , 
       gen-systemstate
 , 
       gen-commands , 
       gen-value , 
       gen-name with
   functions 
      contents : systemstate × name → value;
      comment: Rushby Def. 5;
       
      obs : systemstate × secdomain → systemstate;
      step : systemstate × command → systemstate;
      cdom : command → secdomain;
      comment: Rushby.;
       
      cdom : name → secdomain;
      comment: new by us.;
       
   predicates 
      usedName : name;
      observe : name × secdomain;
      comment: Rushby Def. 5;
       
      alter : name × secdomain;
      comment: Rushby Def. 5;
       
       . ⇒ . : secdomain × secdomain;
      comment: security policy, interference relation;
       
      eqd : systemstate × secdomain × systemstate;
      comment: Rushby Reference Monitor Assumption.;
       
   
   axioms 
      obs-in-domain :  ⊦ usedName(nam) ∧ cdom(nam) ⇒ d → contents(obs(sys, d), nam) = contents(sys, nam);
      used for : s, ls;
       
      obs-other-domain :  ⊦ ¬ (usedName(nam) ∧ cdom(nam) ⇒ d) → contents(obs(sys, d), nam) = null;
      eqd-def :  ⊦ eqd(sys, d, sys0) ↔ (∀ nam. usedName(nam) ∧ cdom(nam) ⇒ d → contents(sys, nam) = contents(sys0, nam));
      extensionality :  ⊦ sys = sys0 ↔ (∀ nam. contents(sys, nam) = contents(sys0, nam));
      RMA-2
      : ⊦ 
          eqd(sys, cdom(co), sys0) ∧ contents(sys, nam) = contents(sys0, nam) ∧ alter(nam, cdom(co)) ∧ usedName(nam)
        → contents(step(sys, co), nam) = contents(step(sys0, co), nam);
      comment: van der Meyden's version.;
       
      RMA-3 :  ⊦ usedName(nam) ∧ contents(step(sys, co), nam) ≠ contents(sys, nam) → alter(nam, cdom(co));
      alter-observe-respects-policy :  ⊦ usedName(nam) ∧ alter(nam, d) ∧ observe(nam, d0) → d ⇒ d0;
      usedName-def :  ⊦ (∃ d. alter(nam, d) ∨ observe(nam, d)) → usedName(nam);
      no-read-up :  ⊦ observe(nam, d) → cdom(nam) ⇒ d;
      comment: this connects observe to the 
                      language based attacker model 
                      (who can see all low variables).;
       
      no-write-down :  ⊦ alter(nam, d) → d ⇒ cdom(nam);
      comment: this follows from alter-observe-respects-policy
                         if we have observe(nam, cdom(nam)) 
                         (this follows from observe-all-names and d ⇒ d);
       
      observe-all-names :  ⊦ cdom(nam) ⇒ d ∧ usedName(nam) → observe(nam, d);
      comment: this is the stronger version of observe, but
                    it is not actually needed. In the language based setting
                    we are talking about a concrete program that has a
                    fixed number of variables/names. We are not interested
                    in variables that do not occur in the program.
                    observe is not equal to readvars(prog) unless we add
                    print(vars, d) at the end.

                    consider low := high, and low is never read in the program.

                    In language based NIF the attacker is outside the system and
                    can observe all low variables at the end.

                    In model based NIF the attacker is part of the system and
                    can only perform (defined) actions. low := high is secure
                    if there is no action that observes low.

                    consider prog: followed by v := v for all v in vars(prog)
                    as actions. Then observe = vars.
                    ;
       
end enrich